package cn.elegent.tx.core.sys;

import cn.elegent.tx.core.rollback.RollBackHandler;

import java.util.HashMap;
import java.util.Map;
import java.util.Set;

/**
 * RollBackData
 * @description 回滚消息处理类存放
 * @author WGL
 * @date 2022/11/7 19:24
*/
public class RollBackData {
    /**
     * 回滚处理类map
     */
    public static Map<String, RollBackHandler> rollBackMap = new HashMap<String,RollBackHandler>();//key:主事务名称+/+子事务名称 value:回滚处理类

    /**
     * 提供基于通配符的方式查询的get方法
     * @param topic
     * @return
     */
    public static Object get(String topic) {
        RollBackHandler acHandlerByTopic = getRollBackHandlerByTopicWildcard(topic);
        if(acHandlerByTopic!=null){
            return acHandlerByTopic;
        }
        //有可能是map的key里含有通配符
        //尝试从map中寻找通配符
        return getRollBackHandlerByMapKeyWildcard(topic);
    }

    /**
     *
     * @param topic
     * @return
     */
    private static Object getRollBackHandlerByMapKeyWildcard(String topic) {
        for (String indexKey : rollBackMap.keySet()) {
            if(indexKey.contains("+")){
                //如果包含+ 说明是单级通配符
                String[] split = indexKey.split("/\\+");
                String key = "";
                for (String index : split) {
                    key+=index;
                }
                //handlerMap中获取
                if(topic.startsWith(key)){
                    return rollBackMap.get(indexKey);
                }
            }else if(indexKey.contains("#")){
                //如果包含#说明是多级通配符
                String[] split = indexKey.split("#");
                String key = split[0];
                //handlerMap中获取
                if(topic.startsWith(key)){
                    return rollBackMap.get(indexKey);
                }
            }
        }
        return null;
    }

    /**
     * 正向匹配--如果传入的topic里存在通配符则匹配
     * @param topic
     * @return
     */
    private static RollBackHandler getRollBackHandlerByTopicWildcard(String topic) {
        //1） 跟进名称完整匹配 -- 如果拿不到 采取通配符获取
        if(rollBackMap.get(topic)!=null){
            return rollBackMap.get(topic);
        }else if(topic.contains("+")){
            //如果包含/+说明是单级通配符
            String[] split = topic.split("/\\+");
            String key = "";
            for (String index : split) {
                key+=index;
            }
            //handlerMap中获取
            Set<String> keys = rollBackMap.keySet();
            for (String index : keys) {
                if(index.startsWith(key)){
                    return rollBackMap.get(index);
                }
            }
        }else if(topic.contains("#")){
            //如果包含/#说明是多级通配符
            String[] split = topic.split("#");
            String key = split[0];
            //handlerMap中获取
            Set<String> keys = rollBackMap.keySet();
            for (String index : keys) {
                if(index.startsWith(key)){
                    return rollBackMap.get(index);
                }
            }
        }
        return null;
    }
}
